package com.zyl.blog.common.domain.rbac.bean;

import cn.dev33.satoken.secure.SaSecureUtil;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zyl.blog.common.domain.rbac.dto.RegisterDTO;
import com.zyl.blog.common.domain.router.bean.Route;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog
 * @Package: com.zyl.common.domain.rbac.bean
 * @ClassName: User
 * @Description: 博客用户表实体类
 * @Author FinalFantasy
 * @Date 2025/6/24-10:58
 */

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName("blog_user")
public class User implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    @TableId(value = "user_id", type = IdType.AUTO)
    @JsonProperty("userId")
    private Long userId;

    /** 用户名（唯一） */
    @TableField("username")
    @JsonProperty("username")
    private String username;

    /** 加密密码 */
    @TableField("password_hash")
    @JsonProperty("passwordHash")
    private String passwordHash;

    /** 邮箱（唯一） */
    @TableField("email")
    @JsonProperty("email")
    private String email;

    /** 手机号 */
    @TableField("phone")
    @JsonProperty("phone")
    private String phone;

    /** 昵称 */
    @TableField("nickname")
    @JsonProperty("nickname")
    private String nickname;

    /** 真实姓名 */
    @TableField("real_name")
    @JsonProperty("realName")
    private String realName;

    /** 性别：0=女，1=男 2=未知 */
    @TableField("gender")
    @JsonProperty("gender")
    private Integer gender;

    /** 生日 */
    @TableField("birthday")
    @JsonProperty("birthday")
    private String birthday;

    /** 身份证号 */
    @TableField("id_card")
    @JsonProperty("idCard")
    @JsonIgnore
    private String idCard;

    /** 头像路径 */
    @TableField("avatar")
    @JsonProperty("avatar")
    private String avatar;

    /** 个人简介 */
    @TableField("bio")
    @JsonProperty("bio")
    private String bio;

    /** 所在地 */
    @TableField("location")
    @JsonProperty("location")
    private String location;

    /** 详细地址 */
    @TableField("address")
    @JsonProperty("address")
    private String address;

    /** 邮编 */
    @TableField("post_code")
    @JsonProperty("postCode")
    private String postCode;

    /** 个人网站 */
    @TableField("website")
    @JsonProperty("website")
    private String website;

    /** 社交媒体链接 */
    @TableField(value = "social_links", typeHandler = JacksonTypeHandler.class)
    @JsonProperty("socialLinks")
    private Map<String, String> socialLinks;

    /** 状态：0=禁用，1=正常 */
    @TableField("status")
    @JsonProperty("status")
    private Integer status;

    /** 角色：reader-读者, author-作者, admin-管理员 */
    @TableField("role")
    @JsonProperty("role")
    private String role;

    /** 注册时间 */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "createTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime createTime;

    /** 更新时间 */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "updateTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime updateTime;

    /** 最后登录时间 */
    @TableField("last_login_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonProperty("lastLoginTime")
    private LocalDateTime lastLoginTime;

    /** 登录次数 */
    @TableField("login_count")
    @JsonProperty("loginCount")
    private Integer loginCount;

    /** 逻辑删除：0=正常，1=已删除 */
    @JsonIgnore
    @TableLogic
    @TableField("is_deleted")
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Integer deleted;

    /* ============ 扩展信息部分 ============*/
    /** 角色信息 */
    @TableField(exist = false)
    @JsonProperty("roles")
    private List<Role> roles;

    /** 路由信息 */
    @TableField(exist = false)
    @JsonProperty("routes")
    private List<Route> routes;

    /** 权限信息 */
    @TableField(exist = false)
    @JsonProperty("permissions")
    private List<Permission> permissions;

    /**
     * 构建用户对象
     */
    public static User buildUser(RegisterDTO dto) {
        User user = new User();

        switch (dto.authType()) {
            case USERNAME:
                user.setUsername(dto.username());
                break;
            case EMAIL:
                user.setEmail(dto.email());
                break;
            case PHONE:
                user.setPhone(dto.phone());
                break;
        }

        user
                .setAvatar(dto.avatar())
                .setPasswordHash(SaSecureUtil.sha256(dto.password()))
                .setStatus(1)
                .setCreateTime(LocalDateTime.now())
                .setLoginCount(0);

        return user;
    }
}
